iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 13
0
Modern Web

我的30天MVC從零到不知道多少學習筆記系列 第 13

從零開始的MVC開發-Controller對View的喊話(2)

  • 分享至 

  • xImage
  •  

本來預計要寫view傳值給controller的部分
但是突然想到model傳值的部分還沒有寫到
順便寫一下多model傳遞,使用viewModel以及Tuple的差別!

多Model傳遞
在複雜的應用中,常常會需要同時使用到多個Model資料
其實前面說過的viewBag,viewData也都可以傳遞Model物件
這樣的寫法雖然有時比較方便,但其實並不太好

public ActionResult DemoMModel(){
    viewBag.class=db.Class.ElementAt(1);
    viewBag.students=db.Student.Where(c=>c.classID==1).ToList();
    return View();
}

在View中就可以這樣使用

@{
    var class=(DemoApp.Models.Class)ViewBag.class;
}
<h3>@class.name</h3>
<ul>
    @foreach(var item in ViewBag.students as List<DemoApp.Models.Student>){
        <li>
            @item.name
        </li>
    }
</ul>

大概是這樣的使用方式,傳遞的model少的話可以用這個方式
但是多的話就不建議這樣做,
...這樣還要一個一個對viewBag的命名,很不方便(不好意思鄉民魂發作

ViewModel
多model傳遞時,建議可以建立一個viewModel類別來傳遞
建立方式很簡單

  1. 先建立一個ViewModels目錄(習慣放在Models下)
  2. 命名的習慣是在後面加上viewModel做結尾
  3. 之後依照需要的資料建立屬性
    就剛剛那個範例,在Models/ViewModels目錄下新增一個ClassStudentViewModel類別
public class ClassStudentViewModel
{
    public Class class{get;set;}
    public IEnumerable<Student> students{get;set;}
}

建立完後,在action內使用

public ActionResult DemoMModel(){
    return View(new ClassStudentViewModel(){
        class=db.Class.ElementAt(1),
        students=db.Student.Where(c=>c.classID==1).ToList()
    });
}

傳遞到view後的使用方式

@model DemoApp.Models.ViewModels.ClassStudentViewModel
<h3>@Model.class.name</h3>
<ul>
    @foreach(var item in Model.students){
        <li>
            @item.name
        </li>
    }
</ul>

這樣在view中讀取時是不是簡單多了呢~
雖然還要建立一個viewModel很麻煩就是了
小提醒是,一個viewModel最好對應一個view就好~
不然需要改動時,會牽扯到很多個view非常不方便!

Tuple類別
不用建立viewModel也可以傳遞多個Model的方法!
Tuple類別可以傳遞1~7個項目
使用方式如下

public ActionResult DemoTuple()
{
    var class=db.Class.ElementAt(1);
    var students=db.Student.Where(c=>c.classID==1).ToList();
    var tupleModel=new Tuple<Class,List<Studnet>>(class,students);
    //var tupleModel=Tuple.Create(class,students);
    //兩句相等
    return View(tupleModel);
} 

View內使用

@using DemoApp.Models;
@model Tuple<Class,List<Studnet>>
@*Item1 is Class*@
<h3>@Model.Item1.name</h3>
<ul>
    @*Item1 is List<Studnet>*@
    @foreach(var item in Model.Item2){
        <li>
            @item.name
        </li>
    }
</ul>

要注意的是讀取的方式是Model.Item1,Model.Item2...這樣讀取
在可讀性上會比較差一些,建議使用時要寫上註解,補強可讀性!

那麼明天再來介紹view傳值給controller的方式吧!~


上一篇
從零開始的MVC開發-Controller對View的喊話
下一篇
從零開始的MVC開發-View對Controller的回應-RouteData
系列文
我的30天MVC從零到不知道多少學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言